/*
 * @(#)Provider.java	1.22 01/12/12
 *
 * 版权所有2002 Sun MicroSystems，Inc.保留所有权利。Sun专有/机密。使用受许可条款的约束。
 */

package java.security;

import java.io.*;
import java.util.*;

/** 这个类代表Java Security API的“提供者”。提供者实现Java安全的部分或全部，包括：
 *
 * <li>Algorithms (such as DSA, RSA, MD5 or SHA-1).
 *
 * <li>密钥生成和管理设施(例如用于算法特定密钥)。
 *
 * </ul>
 *
 * <p>每个提供程序都有一个名称和一个版本号，并在安装它的每个运行时中进行配置。
 * 
 * <p>JDK有一个标准的默认提供程序。它被称为太阳供应者。
 * 
 * 有关提供程序如何工作以及如何安装它们的信息，请参阅“../guide/security/CryptoSpec.html#Provider”>
 * The加密体系结构API规范与参考》中的<a href=Java提供程序类</a>。
 * 
 * @version 	1.19, 01/30/97
 * @author Benjamin Renaud */

public abstract class Provider extends Properties {

    private String name;
    private String info;
    private double version;

    /**
     * 构造具有指定名称、版本号和信息的提供程序。
     *
     * @param name the provider name.
     *
     * @param version the provider version number.
     * 
     * @param info a description of the provider and its services.
     */
    protected Provider(String name, double version, String info) {
	this.name = name;
	this.version = version;
	this.info = info;
    }

    /**
     * 构造具有指定名称的提供程序。将其指定为1.0版。
     *
     * @param name the provider name.  
     */
    Provider(String name) {
	this(name, 1.0, "no information available");
    }

    /**
     * Returns the name of this provider.     
     * 
     * @return the name of this provider.
     */
    public String getName() {
	return name;
    }

    /**
     * Returns the version number for this provider.     
     * 
     * @return the version number for this provider.
     */
    public double getVersion() {
	return version;
    }

    /**
     * 返回提供程序及其服务的人类可读说明。这可能会返回一个带有相关链接的HTML页面。
     *
     * @return a description of the provider and its services.  
     */
    public String getInfo() {
	return info;
    }


    static Provider loadProvider(String name) {
	
	try {
	    Class cl = Class.forName(name);  
	    Object instance = cl.newInstance();

	    if (instance instanceof Provider) {
		return (Provider)instance;
	    }

	} catch (Exception e) {
	    debug("error loading provider " + name, e);
	}
	return null;
    }


    /**
     * 返回一个包含此提供程序的名称和版本号的字符串。
     * 
     * @return 包含此提供程序的名称和版本号的字符串。
     */
    public String toString() {
	return name + " version " + version;
    }

    private static void debug(String msg) {
	Security.debug(msg);
    }

    private static void debug(String msg, Throwable t) {
	Security.debug(msg, t);
    }
}

